// 统一支付工具类 - 支持Stripe和微信支付的配置化
import { initStripe, redirectToCheckout } from './stripe.js'
import i18n from '@/common/i18n/index.js'

/**
 * 获取支付方式配置
 * @param {Object} store - Vuex store实例
 * @returns {string} 'stripe' | 'wechat' | 'auto'
 */
function getPaymentMethod(store) {
	const config = store?.state?.app?.config || {}
	// 优先使用配置中的支付方式，如果没有配置则根据平台自动选择
	const paymentMethod = config.payment_method || 'auto'
	
	if (paymentMethod === 'auto') {
		// 自动选择：H5使用Stripe，微信小程序/公众号使用微信支付
		const platform = uni.getSystemInfoSync().platform
		// #ifdef H5
		return 'stripe'
		// #endif
		// #ifdef MP-WEIXIN
		return 'wechat'
		// #endif
		return 'stripe' // 默认Stripe
	}
	
	return paymentMethod
}

/**
 * 统一支付方法
 * @param {Object} params - 支付参数
 * @param {string} params.order_sn - 订单号
 * @param {string} params.payment - 支付方式（wechat/stripe，如果传auto则根据配置自动选择）
 * @param {string} params.platform - 平台（H5/wxMiniProgram/wxOfficialAccount）
 * @param {Function} params.request - 请求方法
 * @param {Object} params.store - Vuex store实例
 * @param {Function} params.onSuccess - 支付成功回调
 * @param {Function} params.onError - 支付失败回调
 * @param {Function} params.onCancel - 支付取消回调
 */
export async function unifiedPay({
	order_sn,
	payment = 'auto',
	platform,
	request,
	store,
	onSuccess,
	onError,
	onCancel
}) {
	try {
		// 确定支付方式
		let finalPayment = payment
		if (payment === 'auto' || !payment) {
			finalPayment = getPaymentMethod(store)
		}

		// 如果是Stripe支付（仅H5）
		if (finalPayment === 'stripe') {
			// #ifdef H5
			const stripePk = store?.state?.app?.config?.stripe_pk || ''
			if (!stripePk) {
				onError && onError(i18n.t('payment.stripeNotConfigured'))
				return
			}

			try {
				await initStripe(stripePk)
				// 创建Stripe Checkout Session
				const res = await request('payment.stripeCreateSession', {
					order_sn,
					channel: store?.state?.app?.channel || '',
					payment: 'stripe',
					platform: 'H5'
				})
				
				if (res && res.code === 1 && res.data && res.data.id) {
					const result = await redirectToCheckout(res.data.id)
					if (result && result.error) {
						onError && onError(result.error.message || i18n.t('payment.redirectFailed'))
					} else {
						// Stripe支付成功会在回调URL中处理，这里不需要额外处理
						onSuccess && onSuccess()
					}
				} else {
					onError && onError(res.msg || i18n.t('payment.sessionFailed'))
				}
			} catch (e) {
				console.error('Stripe支付失败:', e)
				onError && onError(i18n.t('payment.startFailed'))
			}
			return
			// #endif
			
			// #ifndef H5
			onError && onError(i18n.t('payment.stripeOnlyH5'))
			return
			// #endif
		}

		// 微信支付流程（原有逻辑）
		const res = await request('common.pay', {
			order_sn,
			payment: 'wechat',
			platform
		})

		if (res.code === 1) {
			if (platform === 'H5') {
				// H5微信支付
				const div = document.createElement('divpay')
				div.innerHTML = res.data.pay_data
				document.body.appendChild(div)
			} else {
				// 小程序/公众号支付
				await wechatPay(res.data.pay_data, {
					onSuccess,
					onError,
					onCancel
				})
			}
		} else {
			onError && onError(res.msg || i18n.t('payment.fetchParamsFailed'))
		}
	} catch (error) {
		console.error('支付失败:', error)
		onError && onError(i18n.t('payment.failed'))
	}
}

/**
 * 微信支付
 * @param {Object} pay - 支付参数
 * @param {Object} callbacks - 回调函数
 */
function wechatPay(pay, { onSuccess, onError, onCancel }) {
	// #ifdef MP-WEIXIN
	uni.requestPayment({
		timeStamp: pay.timeStamp,
		nonceStr: pay.nonceStr,
		package: pay.package,
		signType: pay.signType,
		paySign: pay.paySign,
		success: (success) => {
			uni.showToast({
				title: i18n.t('payment.success'),
				icon: 'none',
				duration: 2000
			})
			onSuccess && onSuccess()
		},
		fail: (fail) => {
			if (fail.errMsg && fail.errMsg.indexOf('cancel') !== -1) {
				onCancel && onCancel()
			} else {
				uni.showToast({
					title: i18n.t('payment.failed'),
					icon: 'none',
					duration: 2000
				})
				onError && onError(i18n.t('payment.failed'))
			}
		}
	})
	// #endif

	// #ifdef H5
	if (typeof WeixinJSBridge === 'undefined') {
		onError && onError(i18n.t('payment.wechatNotReady'))
		return
	}
	
	WeixinJSBridge.invoke(
		'getBrandWCPayRequest', {
			"appId": pay.appId,
			"timeStamp": pay.timeStamp,
			"nonceStr": pay.nonceStr,
			"package": pay.package,
			"signType": pay.signType,
			"paySign": pay.paySign
		},
		res => {
			if (res.err_msg == "get_brand_wcpay_request:ok") {
				uni.showToast({
					title: i18n.t('payment.success'),
					icon: 'none',
					duration: 2000
				})
				onSuccess && onSuccess()
			} else {
				uni.showToast({
					title: i18n.t('payment.failed'),
					icon: 'none',
					duration: 2000
				})
				onError && onError(i18n.t('payment.failed'))
			}
		}
	)
	// #endif
}

export default {
	unifiedPay,
	getPaymentMethod
}

